/**
  ******************************************************************************
  * @file    prototypes.h
  * @author  Dragon.Chen
  * @version V1.0.0
  * @date    12-04-2018
  * @brief   一些应用中对象的原型
  * @project linux client
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2018 上海今中网络科技有限公司 </center></h2>
  ******************************************************************************
  */

#ifndef __PROTOTYPES__H__
#define __PROTOTYPES__H__

#include <stdio.h>
#include <stdlib.h>

#define DATA_PACK_MAXBUF			1020				// 数据包最大长度
#define SOCK_RECV_MAXBUF			1024				// SOCKET接收的最大数据

#define RET_SUCCESS                 0
#define RET_FAILED                  -1

/************ 连接服务器返回值 */
#define ERROR_CONNECT_SERVER   	    (1 << 0)


#define CA_CERTIFICATE_PATH  		"/data/data/de.blinkt.openvpn/ca.crt"//此参数没用到，如若使用应使用相对路径

typedef enum __result_t
{
	SUCCESS = 0,
	FAILURE = 1,
} RESULT_T;

typedef enum __bool
{
#ifndef TRUE
	TRUE = 1,           //centos 7.6 confict from header file /usr/include/krb5/krb5.h
#endif
#ifndef FALSE
	FALSE = 0,
#endif
    IDX_TRUE = 1,
    IDX_FALSE = 0,
} BOOL;


/****** openvpn的配置文件 */
typedef struct _openvpn_info
{
	char            *port;
	char            *proto;
    char            *cipher;
    char            *auth;
    char            *tun_mtu;
    char            *fragment;
    char            *mssfix;
    char            *tls_auth;
} OPENVPN_INFO_T;

/****** 数据头部           */
typedef enum _pack_head
{
    IDX_VPN_WELCOME = 1,
    IDX_VPN_VERSION,
    IDX_VPN_X509,
    IDX_VPN_SN,
    IDX_VPN_BIND,
    IDX_VPN_APPTYPE,
    IDX_VPN_OPENVPN,
    IDX_VPN_STUNNEL,
	IDX_VPN_UTUNNEL,
    IDX_VPN_BOTH,
    IDX_VPN_NONE,
	IDX_VPN_HEARTBEAT_TIMEOUT,
    IDX_VPN_HEARTBEAT,
} PACK_HEAD_T;


/// 命令行选项
typedef enum _option_t
{
    OPT_START = 1,
    OPT_STOP,
    OPT_CONFIG_PATH,
    OPT_RECONFIG,
    OPT_REMOVE,
    OPT_RELOAD_CA,
    OPT_RELOAD_CRL,
    OPT_VERSION,
    OPT_HELP,
    OPT_ADDRESS,
} OPTION_T;

/// 命令行选项
typedef struct _command_param_t
{
    u_int               start:1;
    u_int               stop:1;
    u_int               reloadCA:1;
    u_int               reloadCRL:1;
    u_int               version:1;
    u_int               help:1;
    u_int               address:1;
    char               *remmsg;
} COMMAND_PARAM_T;


/****** 数据包            */
typedef struct _data_pack
{
	PACK_HEAD_T       head;									// 数据头部
	char              buffer[DATA_PACK_MAXBUF];				// 数据缓存区
} DATA_PACK_T;


/****** 临时数据          */
typedef struct _relay_data
{
	PACK_HEAD_T       head;								    // 数据头部
	void             *data;									// 中转数据
} RELAY_DATA_T;


/****** cert context数据 */
typedef struct _x509_context
{
	char         *context;							    // X509 Context
	int           length;						            // Context 长度
} X509_CONTEXT_T;


/****** 收发送文件数据    */
typedef struct _file_info
{
    FILE		   *filePtr;					            // 文件指针
    int				position;					            // 文件的当前位置
    int			    length;						            // 文件的长度
    char            *buffer;						            // 缓存区
} FILE_INFO_T;


/****** 用户信息数据      */
typedef struct _client_info
{
	int                 serverFd;							    // 连接服务器的套接字
	int		            bufferFirst;				            // 收发是否完成
	int	                bufferLength;				            // 缓存区长度
	int		            bufferPosition;				            // 已发送数据的位置
	int                 nLostHeartbeat;                         // 丢包次数
	char	            buffer[SOCK_RECV_MAXBUF];				// SOCKET缓存区
	char               *bindInfo;								// 证书信息
    char                serverIp[16];                           // 服务器IP
    int                 port;                                   // 服务器端口
    int                 connectTimeout;                         //链接超时时间
	char               *serialNumber;					        // 证书序列号
    char                commomName[64];                         // CN
    int                 appType;                                // apptype
	FILE_INFO_T	        fileInfo;					            // 接收/发送file
	X509_CONTEXT_T      x509Cert;								// 证书文本
	RELAY_DATA_T        relayData;							    // 中转数据
} CLIENT_INFO_T;

#endif

/******************* (C) COPYRIGHT 2013 上海今中网络科技有限公司 *****END OF FILE****/
